home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / games / texturemapping / 3d.asm next >
Assembly Source File  |  1980-01-03  |  12KB  |  649 lines

  1. ; $$TABS=8
  2.     include    'demo.i'
  3. ; simple 3d package
  4. ; only supports heading for now.
  5.  
  6.     xref    PlayerHeading,PlayerX,PlayerY,PlayerZ
  7.     xref    current_color,sincos,UnClippedPolygon,vertex
  8.     xref    DrawClippedPolygon
  9.     xref    YLRCCFill,YLRUUFill,YLRFiller,lightingtab,current_ltab
  10.     
  11.     xref    KingTut,Fish,Mandrill,Wolves,current_tmap
  12.  
  13. DUNGEON_PT_SIZE    equ    16    ; xyzcuv..
  14. DUNGEON_PT_SHIFT    equ    4
  15.  
  16. render_3d::
  17.     ONTIMER    3
  18.     bsr    generate_matrix
  19.     clr.l    current_color(a6)
  20.     bsr    DoGridPoints
  21.     ONTIMER    12
  22.     bsr    LightPoints
  23.     OFFTIMER    12
  24.     move.l    #YLRCCFill,YLRFiller(a6)
  25.     bsr    RenderFloor
  26.     move.l    #YLRUUFill,YLRFiller(a6)
  27.     bsr    add_objects
  28.     OFFTIMER    3
  29.     rts
  30.  
  31.  
  32. generate_matrix::
  33.     move.w    PlayerHeading(a6),d0
  34.     neg.w    d0
  35.     bsr    sincos        ; d0=sin d1=cos
  36.     move.w    d1,m11(a6)
  37.     move.w    d1,m33(a6)
  38.     move.w    d0,m31(a6)
  39.     neg.w    d0
  40.     move.w    d0,m13(a6)
  41.     asr.w    m13(a6)
  42.     asr.w    m33(a6)
  43.     rts
  44.  
  45. XForm32::
  46. ; entr d4/d5/d6=xyz
  47. ; returns d4-d6=32 bit xyz
  48. ; trashes d0/d7
  49.     sub.l    PlayerX(a6),d4
  50.     sub.l    PlayerY(a6),d5
  51.     sub.l    PlayerZ(a6),d6
  52.     muls    m22(a6),d5
  53.     add.l    d5,d5
  54.     move.l    d4,d0
  55.     move.l    d6,d7    
  56.     muls    m11(a6),d4
  57.     muls    m31(a6),d7
  58.     add.l    d7,d4
  59.     add.l    d4,d4
  60.     muls    m13(a6),d0
  61.     muls    m33(a6),d6
  62.     add.l    d0,d6
  63.     add.l    d6,d6
  64.     rts
  65.  
  66.  
  67. Do3dPoint:
  68. ; entr (a5)=16 bit xyz coordinates
  69. ; exit:d4-d7=point,codes
  70. ;      (a5)=next point
  71. ; trashes: d0
  72. ;
  73.     movem.w    (a5),d4/d5/d6
  74.     lea    3*2(a5),a5
  75.     sub.l    PlayerX(a6),d4
  76.     sub.l    PlayerY(a6),d5
  77.     sub.l    PlayerZ(a6),d6
  78.  
  79. matrix_multiply::
  80. ; for a pure heading matrix, only m11, m13, m31, m33 are important
  81. ; (to throw in y scaling, m22 is the key)
  82. ; x'=(xyz).(m11,m21,m31)
  83. ; y'=(xyz).(m12,m22,m32)
  84. ; z'=(xyz).(m13,m23,m33)
  85. ; entr: d4-d6=xyz
  86. ; exit: d4-d6.w=xyz' d7=codes
  87. ; trashes:
  88.     muls    m22(a6),d5
  89.     add.l    d5,d5
  90.     swap    d5
  91.     move.l    d4,d0
  92.     move.l    d6,d7    
  93.     muls    m11(a6),d4
  94.     muls    m31(a6),d7
  95.     add.l    d7,d4
  96.     add.l    d4,d4
  97.     swap    d4
  98.     muls    m13(a6),d0
  99.     muls    m33(a6),d6
  100.     add.l    d0,d6
  101.     add.l    d6,d6
  102.     swap    d6
  103.  
  104. point_coder::
  105. ; d7=codes(d4,d5,d6)
  106. ; B0 = point to left of z=-x
  107. ; B1 = point to right of z=x
  108. ; B2 = point above z=y
  109. ; B3 = point below z=-y
  110. ; B8 = z<0 (2d clip-possible flag)
  111. ; cc reflects d7
  112.     move    d6,d7
  113.     neg    d7
  114.     bge.s    set_7
  115.     cmp    d7,d4
  116.     blt.s    set_0
  117.     cmp    d6,d4
  118.     bgt.s    set_1
  119.     cmp    d6,d5
  120.     bgt.s    set_2
  121.     cmp    d7,d5
  122.     blt.s    set_3
  123.     moveq    #0,d7
  124.     rts
  125. set_0:    cmp    d6,d5
  126.     bgt.s    set_902
  127.     cmp    d7,d5
  128.     blt.s    set_903
  129.     moveq    #1,d7
  130.     rts
  131. set_902:
  132.     moveq    #5,d7
  133.     rts
  134. set_903:
  135.     moveq    #9,d7
  136.     rts
  137. set_1:    cmp    d6,d5
  138.     bgt.s    set_12
  139.     cmp    d7,d5
  140.     blt.s    set_13
  141.     moveq    #2,d7
  142.     rts
  143. set_12:    moveq    #6,d7
  144.     rts
  145. set_13:    moveq    #$0a,d7
  146.     rts
  147. set_2:    moveq    #4,d7
  148.     rts
  149. set_3:    moveq    #8,d7
  150.     rts
  151. set_7:    cmp    d7,d4
  152.     blt.s    set_8
  153.     cmp    d6,d5
  154.     bgt.s    set_712
  155.     moveq    #$ffffff8a,d7
  156.     rts
  157. set_8:    cmp    d6,d4
  158.     bgt.s    set_81
  159.     cmp    d6,d5
  160.     bgt.s    set_82
  161.     moveq    #$ffffff89,d7
  162.     rts
  163. set_81:    cmp    d6,d5
  164.     bgt.s    set_52
  165.     moveq    #$ffffff8b,d7
  166.     rts
  167. set_52:    cmp    d7,d5
  168.     blt.s    set_523
  169.     moveq    #$ffffff87,d7
  170.     rts
  171. set_523:
  172.     moveq    #$ffffff8f,d7
  173.     rts
  174. set_82:    cmp    d7,d5
  175.     blt.s    set_823
  176.     moveq    #$ffffff85,d7
  177.     rts
  178. set_823:
  179.     moveq    #$ffffff8d,d7
  180. q    rts
  181. set_712:
  182.     cmp    d7,d5
  183.     blt.s    set_4
  184.     moveq    #$ffffff86,d7
  185.     rts
  186. set_4:    moveq    #$ffffff8e,d7
  187.     rts
  188.  
  189. DUNGEON_MINX    equ    -8192
  190. DUNGEON_MINZ    equ    -8192
  191. DUNGEON_XSTEP    equ    16384*2/(DUNGEON_GRID_SIZE)
  192. DUNGEON_ZSTEP    equ    16384*2/(DUNGEON_GRID_SIZE)
  193. DUNGEON_Y        equ    0
  194. DUNGEON_TOPY    equ    2000
  195.  
  196. LightPoints:
  197. ; now, light all grid points.
  198. ; intens=intenstable(|x^2+z^2|)
  199.     move.l    #DUNGEON_MINX,d0
  200.     move.l    #DUNGEON_MINZ,d1
  201.     sub.l    PlayerX(a6),d0
  202.     sub.l    PlayerZ(a6),d1
  203.     move.w    #DUNGEON_GRID_SIZE-1,d2    ; outer counter
  204.     move.l    #DungeonPoints,a0
  205.     move.l    #intenstable,a2
  206. outer_lloop:
  207.     move.l    a0,a1            ; save
  208.     move.l    d0,d7
  209.     move.w    #(DUNGEON_GRID_SIZE)-1,d3    ; inner counter
  210.     move    d1,d5
  211.     muls    d5,d5
  212. inner_lloop:
  213.     move    d0,d4
  214.     muls.w    d4,d4
  215.     add.l    d5,d4
  216.     bpl.s    1$
  217.     neg.l    d4
  218. 1$:
  219.     swap    d4
  220.     cmp.w    #256,d4
  221.     blo.s    2$
  222.     move.w    #255,d4
  223. 2$:    move.w    (a2,d4.w*2),d4
  224.     move.w    d4,8(a0)
  225.  
  226.     ifne    DO_CEILING
  227.     move.w    d4,d6
  228.     mulu    10+DUNGEON_PT_SIZE(a0),d6
  229.     swap    d6
  230.     move    d6,10+DUNGEON_PT_SIZE(a0)
  231.     endc
  232.  
  233.     mulu    10(a0),d4
  234.     swap    d4
  235.     move.w    d4,10(a0)
  236.  
  237.  
  238.     add.l    #DUNGEON_XSTEP/2,d0
  239.     lea    DUNGEON_PT_SIZE*2(a0),a0
  240.     dbra    d3,inner_lloop
  241.     lea    DUNGEON_GRID_SIZE*2*DUNGEON_PT_SIZE(a1),a0
  242.     move.l    d7,d0
  243.     add.l    #DUNGEON_ZSTEP/2,d1
  244.     dbra    d2,outer_lloop
  245.     rts
  246.  
  247. DoGridPoints:
  248. ; fill DungeonPoints with interpolated grid
  249. ; startpt=xform32(MINX,0,MINZ)
  250. ; dp/dx=(m11*xstep,0,m13*xstep)
  251. ; dp/dz=(m31*zstep,0,m33*zstep)
  252. ; for(i=0;i<grid_size;i++)
  253. ;   tempp=startpt
  254. ;   for(j=0;j<grid_size;j++)
  255. ;     *(nextpt++)=tempp *(nextpt++)=codes(tempp)
  256. ;     tempp+-dp/dx
  257. ;   startpt+=dp/dz
  258.  
  259.     move.w    #$1234,rand_seed(a6)
  260.     ONTIMER    8
  261.     move.l    #DUNGEON_MINX,d4
  262.     move.l    #DUNGEON_Y,d5
  263.     move.l    #DUNGEON_MINZ,d6
  264.     bsr    XForm32                ; d4-d6=upper left corner
  265.     swap    d5
  266. ; now, gen deltas
  267.     move.l    #DUNGEON_TOPY,d0
  268.     sub.l    PlayerY(a6),d0
  269.     muls    m22(a6),d0
  270.     add.l    d0,d0
  271.     swap    d0
  272.     move.w    m11(a6),d1
  273.     muls    #DUNGEON_XSTEP,d1
  274.     move.l    d1,a5
  275.     move.w    m13(a6),d1
  276.     muls    #DUNGEON_XSTEP,d1        ; a5/d1=dp/dx
  277.     move.w    m31(a6),d2
  278.     muls    #DUNGEON_ZSTEP,d2
  279.     move.w    m33(a6),d3
  280.     muls    #DUNGEON_ZSTEP,d3
  281.     move.l    d2,a1
  282.     move.l    d3,a2                ; a1/a2=dp/dz
  283.     move.l    #DungeonPoints,a0
  284.     moveq    #DUNGEON_GRID_SIZE-1,d2        ; outer counter
  285. outer_loop:
  286.     move.l    d4,a3                ; save
  287.     move.l    d6,a4
  288.     moveq    #DUNGEON_GRID_SIZE-1,d3        ; inner counter
  289. inner_loop:
  290.     swap    d4
  291.     swap    d6
  292.     bsr    point_coder
  293.     movem.w    d4-d7,(a0)
  294.     move.w    rand_seed(a6),d7
  295.     mulu    #$1efd,d7
  296.     add    #$dff,d7
  297.     move.w    d7,rand_seed(a6)
  298.     move.w    d7,10(a0)
  299.     exg.l    d0,d5
  300.     bsr    point_coder
  301.     movem.w    d4-d7,DUNGEON_PT_SIZE(a0)
  302.  
  303.     ifne    DO_CEILING
  304.     move.w    rand_seed(a6),d7
  305.     mulu    #$1efd,d7
  306.     add    #$dff,d7
  307.     move.w    d7,rand_seed(a6)
  308.     move.w    d7,DUNGEON_PT_SIZE+10(a0)
  309.     endc
  310.  
  311.     lea    DUNGEON_PT_SIZE*2(a0),a0
  312.     exg.l    d0,d5
  313.     swap    d4
  314.     swap    d6
  315.     add.l    a5,d4
  316.     add.l    d1,d6
  317.     dbra    d3,inner_loop
  318.     move.l    a3,d4
  319.     move.l    a4,d6
  320.     add.l    a1,d4
  321.     add.l    a2,d6
  322.     dbra    d2,outer_loop
  323.     OFFTIMER    8
  324.     rts
  325.  
  326. RenderFloor:
  327. ; now, let's attempt to fill polygons for a test
  328. ; for(i=0;i<npoints-1;i++)
  329. ;  for(j=0;j<npoints-1;j++)
  330. ;   dopoly(dp[i,j],dp[i,j+1],dp[i+1,j+1],dp[i+1,j]
  331.     ONTIMER    9
  332.     move.l    #DungeonPoints,a0
  333.     move.w    #DUNGEON_GRID_SIZE-2,d7    ; outer
  334. 1$:
  335.     ifne    DO_CEILING
  336.     move.w    #((DUNGEON_GRID_SIZE-1)*2)-1,d6    ; inner
  337.     else
  338.     move.w    #(DUNGEON_GRID_SIZE-1)-1,d6
  339.     endc
  340.  
  341.     move.l    a0,a1            ; save
  342. 2$:
  343.     lea    temp_polygon_buffer(a6),a2
  344.     movem.w    (a1),d2/d3/d4/d5        ; xyzc
  345.     move.w    d5,d0        ; orcodes
  346.     move.w    d5,d1        ; andcodes
  347.     movem.w    d2/d3/d4/d5,(a2)
  348.     move.w    10(a1),8(a2)
  349.     lea    6*2(a2),a2
  350.  
  351.     movem.w    DUNGEON_PT_SIZE*2(a1),d2/d3/d4/d5        ; xyzc
  352.     or.w    d5,d0
  353.     and.w    d5,d1
  354.     movem.w    d2/d3/d4/d5,(a2)
  355.     move.w    DUNGEON_PT_SIZE*2+10(a1),8(a2)
  356.     lea    6*2(a2),a2
  357.  
  358.     movem.w    DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE*2+DUNGEON_PT_SIZE*2(a1),d2/d3/d4/d5
  359.                     ; xyzc
  360.     or.w    d5,d0
  361.     and.w    d5,d1
  362.     movem.w    d2/d3/d4/d5,(a2)
  363.     move.w    DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE*2+DUNGEON_PT_SIZE*2+10(a1),8(a2)
  364.     lea    6*2(a2),a2
  365.  
  366.     movem.w    DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE*2(a1),d2/d3/d4/d5        ; xyzc
  367.     and.w    d5,d1
  368.     bne.s    3$    ; trivial reject
  369.     or.w    d5,d0
  370.     movem.w    d2/d3/d4/d5,(a2)
  371.     move.w    DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE*2+10(a1),8(a2)
  372.     lea    6*2(a2),a2
  373.     movem.l    d6/d7/a0/a1,-(a7)
  374.     move.l    a2,a1
  375.     lea    temp_polygon_buffer(a6),a0
  376.     OFFTIMER    9
  377.     bsr    DrawClippedPolygon
  378.     ONTIMER    9
  379.     movem.l    (a7)+,d6/d7/a0/a1
  380. 3$:    ifne    DO_CEILING
  381.     lea    DUNGEON_PT_SIZE(a1),a1    ; was *2
  382.     else
  383.     lea    DUNGEON_PT_SIZE*2(a1),a1
  384.     endc
  385.     dbra    d6,2$
  386.     lea    DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE*2(a0),a0
  387.     dbra    d7,1$
  388.     OFFTIMER    9
  389. done_3dblock:
  390.     rts
  391.  
  392. DO_FACE    macro    x1,z1,x2,z2
  393. ;        \1 \2 \3 \4
  394. ; generate x1,-y,z1 x2,-y,z2 x2,+y,z2 x1,+y,z1
  395.     moveq    #0,d0    ;; codes_or
  396.     moveq    #-1,d1    ;; codes_and
  397.     lea    temp_polygon_buffer(a6),a1
  398.     move.l    a1,a0
  399.     move.l    \2,d3
  400.     lsl.l    #DUNGEON_GRID_SHIFT,d3
  401.     add.l    \1,d3
  402.     lsl.l    #DUNGEON_PT_SHIFT+1,d3
  403.     move.l    #DungeonPoints,a2
  404.     add.l    d3,a2
  405.     move.w    6(a2),d3
  406.     or.w    d3,d0
  407.     and.w    d3,d1
  408.     move.l    (a2),(a1)
  409.     move.l    4(a2),4(a1)
  410.     move.l    #$7fff0000,8(a1)
  411.     move.w    8(a2),d2
  412.     move.w    DUNGEON_PT_SIZE+6(a2),d3
  413.     or.w    d3,d0
  414.     and.w    d3,d1
  415.     move.l    DUNGEON_PT_SIZE(a2),36(a1)
  416.     move.l    DUNGEON_PT_SIZE+4(a2),40(a1)
  417.     move.l    #$00000000,44(a1)
  418.     move.l    \4,d3
  419.     lsl.l    #DUNGEON_GRID_SHIFT,d3
  420.     add.l    \3,d3
  421.     lsl.l    #DUNGEON_PT_SHIFT+1,d3
  422.     move.l    #DungeonPoints,a2
  423.     add.l    d3,a2
  424.     move.w    6(a2),d3
  425.     or.w    d3,d0
  426.     and.w    d3,d1
  427.     move.l    (a2),12(a1)
  428.     move.l    4(a2),16(a1)
  429.     add.w    8(a2),d2
  430.     move.l    #$7fff7fff,20(a1)
  431.     move.w    DUNGEON_PT_SIZE+6(a2),d3
  432.     or.w    d3,d0
  433.     and.w    d3,d1
  434.     bne.s    trivial_reject\@
  435.     move.l    DUNGEON_PT_SIZE(a2),24(a1)
  436.     move.l    DUNGEON_PT_SIZE+4(a2),28(a1)
  437.     move.l    #$00007fff,32(a1)
  438. ; now, d2=ltab
  439.     sub.l    a2,a2
  440.     lsr.w    #1,d2
  441.     beq.s    trivial_reject\@
  442.     cmp.w    #$2f00,d2
  443.     bhs.s    got_ltab\@
  444.     clr.b    d2
  445.     move.l    #lightingtab,a2
  446.     add.w    d2,a2
  447. got_ltab\@:
  448.     move.l    a2,current_ltab(a6)
  449.     lea    12*4(a1),a1
  450.     movem.l    d4-d7,-(a7)
  451.     bsr    DrawClippedPolygon
  452.     movem.l    (a7)+,d4-d7
  453. trivial_reject\@:
  454.     endm
  455.  
  456.  
  457.  
  458. do_3dblock::
  459. ; passed (a3)=&block
  460. ; adr(x,z)=((z*gridsize)+x)*16
  461. ; first, do upper face
  462.     movem.w    (a3),d4/d5/d6/d7    ; minx,minx,maxx,maxz
  463. ; now, check if can see upper face
  464. ; if 1024*(b.maxz)+DUNGEON_MINZ <PlayerZ, then visible
  465.     move.l    d7,d0
  466.     lsl.l    #8,d0
  467.     lsl.l    #2,d0
  468.     add.l    #DUNGEON_MINZ,d0
  469.     cmp.l    PlayerZ(a6),d0
  470.     bge    no_topface
  471. ; for clockwise face, do minx,+y,maxz minx,-y,maxz maxx,-y,maxz maxx,+y,maxz
  472.     move.l    #KingTut,current_tmap(a6)
  473.     DO_FACE    d4,d7,d6,d7
  474. no_topface:
  475. ; now, do left face
  476. ; if playerx < (1024*(b.minx)) then visible
  477.     move.l    d4,d0
  478.     lsl.l    #8,d0
  479.     lsl.l    #2,d0
  480.     add.l    #DUNGEON_MINX,d0
  481.     cmp.l    PlayerX(a6),d0
  482.     ble    no_leftface
  483.     move.l    #Fish,current_tmap(a6)
  484.     DO_FACE    d4,d5,d4,d7
  485. no_leftface:
  486. ; now, do right face
  487. ; if playerx > (1024*max+minx) then visible
  488.     move.l    d6,d0
  489.     lsl.l    #8,d0
  490.     lsl.l    #2,d0
  491.     add.l    #DUNGEON_MINX,d0
  492.     cmp.l    PlayerX(a6),d0
  493.     bge    no_rightface
  494.     move.l    #Wolves,current_tmap(a6)
  495.     DO_FACE    d6,d7,d6,d5
  496.  
  497. no_rightface:
  498. ; now, do lower face
  499. ; if playerZ < minz then visible
  500.     move.l    d5,d0
  501.     lsl.l    #8,d0
  502.     lsl.l    #2,d0
  503.     add.l    #DUNGEON_MINZ,d0
  504.     cmp.l    PlayerZ(a6),d0
  505.     ble    no_botface
  506.     move.l    #Mandrill,current_tmap(a6)
  507.     DO_FACE    d6,d5,d4,d5
  508. no_botface:
  509.     rts
  510.  
  511.  
  512. add_objects::
  513. ; lame "distance" sort
  514.     lea    ObjectList,a0
  515.     move.l    PlayerX(a6),d2
  516.     move.l    PlayerZ(a6),d3
  517.     lea    sortlist(a6),a1
  518. next_object::
  519.     tst.l    (a0)+        ; terminator?
  520.     beq.s    done_adding
  521. do_add:    move.l    (a0)+,d0    ; x
  522.     move.l    (a0)+,d1    ; z
  523.     sub.l    d2,d0
  524.     bpl.s    1$
  525.     neg.l    d0
  526. 1$:    sub.l    d3,d1
  527.     bpl.s    2$
  528.     neg.l    d1
  529. 2$:    cmp.l    d0,d1
  530.     bhs.s    3$
  531.     exg.l    d0,d1
  532. 3$:    add.l    d1,d1
  533.     add.l    d1,d0        ; d0=distance approximation
  534.     cmp.l    4(a0),d0
  535.     bhs.s    no_add_to_sorted_list
  536.     move.l    d0,(a0)        ; save distance
  537.     move.l    a0,(a1)+
  538. no_add_to_sorted_list:
  539.     lea    12(a0),a0    ; skip to next object
  540.     tst.l    (a0)+
  541.     bne.s    do_add
  542. done_adding:
  543. ; now, sort list from a0 to a1
  544. ; only a tiny number of objects, so use bubble sort
  545.     lea    -4(a1),a2
  546. outer:    lea    sortlist(a6),a0
  547.     cmp.l    a0,a2
  548.     ble.s    done_outer
  549. resort:    cmp.l    a0,a2
  550.     beq.s    done_inner
  551.     move.l    (a0)+,a3
  552.     move.l    (a0),a4
  553.     move.l    (a3),d0
  554.     cmp.l    (a4),d0
  555.     bhs.s    resort
  556.     move.l    a4,-4(a0)
  557.     move.l    a3,(a0)
  558.     bra.s    resort
  559. done_inner:
  560.     lea    -4(a2),a2
  561.     bra.s    outer
  562. done_outer:
  563.  
  564. ; now, drain sort list
  565.     lea    sortlist(a6),a0
  566. nextobject:
  567.     cmp.l    a0,a1        ; at end?
  568.     beq.s    done_plotting_objects
  569.     move.l    (a0)+,a3
  570.     move.l    -12(a3),a4    ; get handler pointer
  571.     move.l    8(a3),a3    ; get data pointer
  572.     movem.l    a0/a1,-(a7)
  573.     jsr    (a4)
  574.     movem.l    (a7)+,a0/a1
  575.     bra.s    nextobject
  576. done_plotting_objects:
  577.     rts
  578.  
  579.     section    __MERGED,data
  580. m11::    dc.w    $7fff
  581. m21::    dc.w    0
  582. m31::    dc.w    0
  583. m12::    dc.w    0
  584. m22::    dc.w    -$73ff
  585. m32::    dc.w    0
  586. m13::    dc.w    0
  587. m23::    dc.w    0
  588. m33::    dc.w    $7fff
  589.  
  590. rand_seed::    dc.w    1
  591.  
  592. sortlist::
  593.     ds.l    20
  594.  
  595. tmap_selector::
  596.     dc.w    0
  597.  
  598. temp_polygon_buffer::
  599.     ds.w    6*18
  600.  
  601.     section    DungeonArray,DATA
  602. defblock    macro    x,z,sym
  603. ;        \1\2 \3
  604.     dc.l    do_3dblock
  605.     dc.l    -8192+512+(\1*1024)
  606.     dc.l    -8192+512+(\2*1024)
  607.     dc.l    0
  608.     dc.l    8192+4096
  609.     dc.l    \3
  610.     endm
  611.  
  612. ; dc.w x,y,z,codes,x,y,z,codes [0,0]
  613. ; dc.w x,y,z,codes,x,y,z,codes [1,0]
  614. DungeonPoints::
  615.     ds.w    DUNGEON_GRID_SIZE*DUNGEON_GRID_SIZE*DUNGEON_PT_SIZE
  616.  
  617. ObjectList::
  618.  
  619.     defblock    1,1,block_b1
  620.     defblock    2,2,block_b2
  621.     defblock    1,3,block_b3
  622.     defblock    12,1,block_b4
  623.     defblock    7,4,block_b5
  624.     defblock    4,5,block_b6
  625.     defblock    12,7,block_b7
  626.     defblock    2,10,block_b8
  627.     defblock    2,13,block_b9
  628.     defblock    6,11,block_b10
  629.     defblock    11,13,block_b11
  630.     dc.l    0            ; terminator
  631.  
  632. block_b1:    dc.w    1,1,1+1,1+1
  633. block_b2:    dc.w    2,2,2+1,2+1
  634. block_b3:    dc.w    1,3,1+1,3+1
  635. block_b4:    dc.w    12,1,12+1,1+1
  636. block_b5:    dc.w    7,4,7+1,4+1
  637. block_b6:    dc.w    4,5,4+1,5+1
  638. block_b7:    dc.w    12,7,12+1,7+1
  639. block_b8:    dc.w    2,10,2+1,10+1
  640. block_b9:    dc.w    2,13,2+1,13+1
  641. block_b10:    dc.w    6,11,6+1,11+1
  642. block_b11:    dc.w    11,13,11+1,13+1
  643.  
  644.  
  645.     section    IntensityTable,DATA
  646. intenstable::
  647.     include    'intens.i'
  648.